#include "SymboleValue.h"
#include <stdlib.h>
#include  <typeinfo>

////////////////////////////////////////////////////////////////////////////////

SymboleValue::SymboleValue(Symbole s) :
Symbole(s.getChaine()) {
    if (s == "<ENTIER>") {
        valeur = new TypeInt(atoi(s.getChaine().c_str())); // c_str convertit une string en char*
        defini = true;
    } else if (s == "<REEL>") {
        valeur = new TypeFloat(atof(s.getChaine().c_str()));
        defini = true;
    } else if (s == "<CHAINE>") {
        valeur = new TypeString(s.getChaine().c_str());
        defini = true;
    } else {
        valeur = NULL;
        defini = false;
    }

}

/*void SymboleValue::transcod(accFichier aF) {
    string code, s;
    s = this->getChaine();
    if (s == "<ENTIER>") {
        code = "int this->getChaine()";
    } else if (s == "<REEL>") {
        code = "float this->getChaine()";
    } else if (s == "<CHAINE>") {
        code = "char* this.getChaine().c_str())";
    }
    aF.ecrireF(code);
}*/
//Type* SymboleValue::getValeur() {
//    if (typeid (*valeur) == typeid (TypeInt)) {
//        return (dynamic_cast<TypeInt*> (valeur));
//    } else if (typeid (*valeur) == typeid (TypeString)) {
//        return (dynamic_cast<TypeString*> (valeur));
//    } else if (typeid (*valeur) == typeid (TypeFloat)) {
//        return (dynamic_cast<TypeFloat*> (valeur));
//
//    } else {
//        cout << "Erreur getValeur symbole valué" << endl;
//    }
//
//}
////////////////////////////////////////////////////////////////////////////////

void SymboleValue::afficher(unsigned short indentation) {
    Noeud::afficher(indentation);
    cout << "Feuille - Symbole value : " << getChaine() << endl; // on affiche la chaine du symbole
}

////////////////////////////////////////////////////////////////////////////////
// Attention : cette fonction (operator) n'est pas membre de la classe SymboleValue

ostream & operator <<(ostream & cout, SymboleValue symb) {
    cout << (Symbole) symb << "\t\t - Valeur=";
    if (symb.defini) {
        if (typeid (*symb.valeur) == typeid (TypeInt)) {
            TypeInt* vi = dynamic_cast<TypeInt*> (symb.valeur);
            cout << vi->getValeur();

        } else if (typeid (*symb.valeur) == typeid (TypeString)) {
            TypeString* vi = dynamic_cast<TypeString*> (symb.valeur);
            cout << vi->getValeur();

        } else if (typeid (*symb.valeur) == typeid (TypeFloat)) {
            TypeFloat* vi = dynamic_cast<TypeFloat*> (symb.valeur);
            cout << vi->getValeur();

        } else {
            cerr << "pas le bon type" << endl;
        }
    } else {
        cout << "indefinie ";
    }
    return cout;
}
